#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <unistd.h>

int main()
{
  int pipefd[2] = {0};
  if(pipe(pipefd) != 0)
  {
    perror("pipe error");
    return -1;
  }

  printf("pipefd[0]: %d\n", pipefd[0]);//3
  printf("pipefd[1]: %d\n", pipefd[1]);//4

  //pipefd[0]:读取端，pipefd[1]:写入端
  //父进程读取，子进程写入
  if(fork() == 0)
  {
    //chlid
    close(pipefd[0]);//关闭读取端
    int cnt = 0;
    while(1)
    {
      write(pipefd[1], "a", 1);
      ++cnt;
      printf("cnt:%d\n", cnt);
    }
    exit(1);
  }

  //father
  close(pipefd[1]);
  while(1)
  {
    sleep(10);
    char c;
    ssize_t s = read(pipefd[0], &c, sizeof(c));
    printf("father take:%c\n", c);
  }
  return 0;
}

//int main()
//{
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe error");
//    return -1;
//  }
//
//  printf("pipefd[0]: %d\n", pipefd[0]);//3
//  printf("pipefd[1]: %d\n", pipefd[1]);//4
//
//  //pipefd[0]:读取端，pipefd[1]:写入端
//  //父进程读取，子进程写入
//  if(fork() == 0)
//  {
//    //chlid
//    close(pipefd[0]);//关闭读取端
//    const char* msg = "hello world";
//    while(1)
//    {
//
//      write(pipefd[1], msg, strlen(msg));
//    }
//    exit(0);
//  }
//
//  //father
//  close(pipefd[1]);
//  while(1)
//  {
//    sleep(10);
//    char buffer[64] = {0};
//    ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);
//    buffer[s] = '\0';
//    if(s > 0)
//    {
//      printf("father take: %s\n", buffer); 
//      break;
//    }
//    else if(s == 0)
//    {
//      printf("write quiti\n");
//      break;
//    }
//    else 
//    {
//      break;
//    }
//  }
//  close(pipefd[0]);
//  int status = 0;
//  waitpid(-1, &status, 0);
//  printf("exit code: %d\n", (status>>8)&0xFF);
//  printf("exit signle: %d\n", status&0x7f);
//  return 0;
//}

//int main()
//{
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe error");
//    return -1;
//  }
//
//  printf("pipefd[0]: %d\n", pipefd[0]);//3
//  printf("pipefd[1]: %d\n", pipefd[1]);//4
//
//  //pipefd[0]:读取端，pipefd[1]:写入端
//  //父进程读取，子进程写入
//  if(fork() == 0)
//  {
//    //chlid
//    close(pipefd[0]);//关闭读取端
//    const char* msg = "hello world";
//    while(1)
//    {
//
//      write(pipefd[1], msg, strlen(msg));
//      sleep(10);
//      break;
//    }
//    close(pipefd[1]);
//    exit(0);
//  }
//
//  //father
//  close(pipefd[1]);
//  while(1)
//  {
//    char buffer[64] = {0};
//    ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);
//    buffer[s] = '\0';
//    if(s > 0)
//    {
//      printf("father take: %s\n", buffer); 
//    }
//    else if(s == 0)
//    {
//      printf("write quiti\n");
//      break;
//    }
//    else 
//    {
//      break;
//    }
//  }
//  return 0;
//}

//int main()
//{
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe error");
//    return -1;
//  }
//
//  printf("pipefd[0]: %d\n", pipefd[0]);//3
//  printf("pipefd[1]: %d\n", pipefd[1]);//4
//
//  //pipefd[0]:读取端，pipefd[1]:写入端
//  //父进程读取，子进程写入
//  if(fork() == 0)
//  {
//    //chlid
//    close(pipefd[0]);//关闭读取端
//    int cnt = 0;
//    while(1)
//    {
//      write(pipefd[1], "a", 1);
//      ++cnt;
//      printf("cnt:%d\n", cnt);
//    }
//    exit(1);
//  }
//
//  //father
//  close(pipefd[1]);
//  while(1)
//  {
//    sleep(10);
//    char c[1024*4+1] = {0};
//    ssize_t s = read(pipefd[0], c, sizeof(c));
//    c[s] = '\0';
//    printf("father take:%c\n", c[0]);//打印一个字符，防止刷屏
//  }
//  return 0;
//}


//int main()
//{
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe error");
//    return -1;
//  }
//
//  printf("pipefd[0]: %d\n", pipefd[0]);//3
//  printf("pipefd[1]: %d\n", pipefd[1]);//4
//
//  //pipefd[0]:读取端，pipefd[1]:写入端
//  //父进程读取，子进程写入
//  if(fork() == 0)
//  {
//    //chlid
//    close(pipefd[0]);//关闭读取端
//    const char* msg = "hello world";
//    while(1)
//    {
//      write(pipefd[1], msg, strlen(msg));
//    }
//    exit(1);
//  }
//
//  //father
//  close(pipefd[1]);
//  while(1)
//  {
//    sleep(1);
//    char buffer[64] = {0};
//    ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);
//    if(s == 0)
//    {
//      printf("child quit..\n");
//      break;
//    }
//
//    else if(s > 0)
//    {
//      buffer[s] = 0;
//      printf("child say to father:%s\n", buffer);
//    }
//    else 
//    {
//      printf("read error...\n");
//      break;
//    }
//  }
//  
//  return 0;
//}
